#include "TestRegistrosFijos.h"
#include "../src/recursoDeAlmacenamiento/RecursoDeAlmacenamientoDirecto.h"
#include "../src/recursoDeAlmacenamiento/RecursoDeAlmacenamiento.h"
#include "../src/recursoDeAlmacenamiento/FabricaRecursosAlmacenamiento.h"
#include "../src/estrategiaRecurso/Archivo.h"
#include "../src/estrategiaAlmacenamiento/IteradorRegistrosFijos.h"

#include <string>
using namespace std;


TestRegistrosFijos::TestRegistrosFijos() {


}

TestRegistrosFijos::~TestRegistrosFijos() {


}

void TestRegistrosFijos::run() {
	this->testGuardar();
	//this->testIterarRegistros();
	//this->testAccesoDirecto();
}

void TestRegistrosFijos::testGuardar() {

	system("rm ./Archivos/registros*");

	string path = "./Archivos/registros";

	cantBytes tamanioRegistro = 5;

	RecursoDeAlmacenamiento* recurso = FabricaRecursosAlmacenamiento::getFabrica()->crearRecursoArchivoRegistros(path,tamanioRegistro,DIFERIDA);
	Bytes holas("holas");

	recurso->guardar(holas);

	delete recurso;

	Archivo archivo(path);

	assert(archivo.leer(0,1).toString() == ARCH_REGISTROS_TAM_FIJO,"Test Tipo de Archivo");

	Bytes tamanioRegistros;
	tamanioRegistros.agregar(&tamanioRegistro,sizeof(tamanioRegistro),0);

	assert(archivo.leer(1,4).toString() == tamanioRegistros.toString(),"Test Tamanio Registro");

	char vivo = 1;
	string registroVivo;

	registroVivo += vivo;

	assert(archivo.leer(6,1).toString() == registroVivo,"Test Registro vivo");

	assert(archivo.leer(7,5).toString() == "holas","Test Leer Registro");
}


void TestRegistrosFijos::testIterarRegistros() {

	system("rm ./Archivos/registros*");

	string path = "./Archivos/registros";

	cantBytes tamanioRegistro = 5;

	RecursoDeAlmacenamiento* recurso = FabricaRecursosAlmacenamiento::getFabrica()->crearRecursoArchivoRegistros(path,tamanioRegistro,DIFERIDA);

	Bytes dato1("dato1");
	Bytes dato2("dato2");
	Bytes dato3("dato3");

	recurso->guardar(dato1);
	recurso->guardar(dato2);
	recurso->guardar(dato3);

	Iterador *iterador = recurso->getIterador();

	assert(iterador->getSiguiente().toString() == "dato1","Test Dato1 Registros Fijos");
	assert(iterador->tieneSiguiente(),"Test Iterador tiene siguiente");
	assert(iterador->getSiguiente().toString() == "dato2","Test Dato2 Registros Fijos");
	assert(iterador->getSiguiente().toString() == "dato3","Test Dato2 Registros Fijos");
	fail(iterador->tieneSiguiente(),"Test Iterador no tiene siguiente");

	iterador->reiniciarIterador();
	assert(iterador->getSiguiente().toString() == "dato1","Test reiniciar Iterador");

	delete iterador;
	delete recurso;
}

void TestRegistrosFijos::testAccesoDirecto() {

	string path = "./Archivos/registros";

	cantBytes tamanioRegistro = 5;

	RecursoDeAlmacenamientoDirecto* recurso = (RecursoDeAlmacenamientoDirecto*)FabricaRecursosAlmacenamiento::getFabrica()->crearRecursoAccesoDirecto(path,tamanioRegistro,DIFERIDA);

	Bytes dato1 = recurso->cargar(0);
	Bytes dato2 = recurso->cargar(1);
	Bytes dato3 = recurso->cargar(2);

	assert(dato1.toString() == "dato1", "Test Acceso Directo 1");
	assert(dato2.toString() == "dato2", "Test Acceso Directo 2");
	assert(dato3.toString() == "dato3", "Test Acceso Directo 3");

	recurso->eliminar(0);

	dato1 = recurso->cargar(0);
	dato2 = recurso->cargar(1);

	assert(dato1.toString() == "", "Test Acceso Directo 4");
	assert(dato2.toString() == "dato2", "Test Acceso Directo 5");

	dato3.setBytes("modi3");
	dato1.setBytes("holas");

	recurso->guardar(dato1,0);
	recurso->guardar(dato3,2);

	dato1 = recurso->cargar(0);
	dato3 = recurso->cargar(2);

	assert(dato2.toString() == "dato2", "Test Acceso Directo 5");

	assert(dato1.toString() == "holas", "Test Acceso Directo 6");
	assert(dato3.toString() == "modi3", "Test Acceso Directo 7");

	delete recurso;

}
